package thread;

/**
 * @User: vitobo
 * @Date: 2024-07-31
 * @Description:  wait 和 notify
 *
 *   等待和通知 必须使用相同的对象
 *
 *   wait() 无参数版本, 就是死等的;
 *   wait(long timeout) 带参数版本, 指定了等待的最大时间;
 *
 *
 */
public class ThreadDemo17 {

    public static void main(String[] args) throws InterruptedException {
        Object o = new Object();

        // 这个线程负责进行等待
        Thread t1 = new Thread(()->{
            System.out.println("t1: wait之前");
            try {
                synchronized (o){
                    o.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("t1: wait之后");
        });

        // 这个线程负责进行通知
        Thread t2 = new Thread(()->{
            System.out.println("t2: notify之前");
            synchronized (o){
                // notify必须要获取到锁, 才能进行通知
                o.notify();
            }

            System.out.println("t2: notify之后");
        });


        // t1 和 t2谁先启动是不确定的; 此时不能保证一定是先执行wait,后执行notify
        // 尽量保证先执行wait,在执行notify
        t1.start();
        Thread.sleep(1000);
        t2.start();



    }
}
